/*
 * SeparatorParameters.h
 *
 *  Created on: Jan 24, 2014
 *      Author: ik
 */

#ifndef SEPARATORPARAMETERS_H_
#define SEPARATORPARAMETERS_H_

#include <Cliquer.h>

typedef enum { Goloso, BitParallel, RD } TiposCliquer;
typedef enum { Clique, Fuerte } TiposProyeccion;

struct SeparatorParameters
{
public:
	const TiposCliquer 		buscadorDeCliquesVioladas;
	const TiposCliquer 		buscadorDeCliquesProyectables;
	const TiposCliquer 		calculadorDeLambda;
	const TiposProyeccion	PROJTYPE;
	const int				MAXCLIQUESZ;
	const int 				K;
	const int 				MAXITER;
	const double 			MINVIOLATION;
	const int				SMALLGRAPH;			//!< número de vértices de pequeños grafos; usado en el método aproximado de cálculo de lambda

	SeparatorParameters(TiposCliquer cliquesVioladas=Goloso, TiposCliquer cliquesProyectables=Goloso,
			TiposCliquer lambda=Goloso,	TiposProyeccion proj=Clique, int w=2, int k=5, int iter=100, double vio=0.3, int smg=50):
		buscadorDeCliquesVioladas(cliquesVioladas), buscadorDeCliquesProyectables(cliquesProyectables),
		calculadorDeLambda(lambda), PROJTYPE(proj), MAXCLIQUESZ(w), K(k), MAXITER(iter), MINVIOLATION(vio),
		SMALLGRAPH(smg)
	{};
	void print()
	{
		cout << "Buscador de cliques violadas: ";
		switch (buscadorDeCliquesVioladas) {
			case Goloso:
				cout << "Goloso";
				break;
			case BitParallel:
				cout << "Bit Parallel";
				break;
			case RD:
				cout << "Russian Dolls";
				break;
			default:
				break;
		};
		cout << endl;
		cout << "Buscador de cliques proyectables: ";
		switch (buscadorDeCliquesProyectables) {
			case Goloso:
				cout << "Goloso";
				break;
			case BitParallel:
				cout << "Bit Parallel";
				break;
			case RD:
				cout << "Russian Dolls";
				break;
			default:
				break;
		};
		cout << endl;
		cout << "Calculador de lambda: ";
		switch (calculadorDeLambda) {
			case Goloso:
				cout << "Goloso";
				break;
			case BitParallel:
				cout << "Bit Parallel";
				break;
			case RD:
				cout << "Russian Dolls";
				break;
			default:
				break;
		};
		cout << endl;
		cout << "Tipo de proyección: ";
		switch (PROJTYPE) {
			case Clique:
				cout << "Clique";
				break;
			case Fuerte:
				cout << "Clique Fuerte";
				break;
			default:
				break;
		};
		cout << endl;
		cout << "Tamaño máximo de clique de proyección: " << MAXCLIQUESZ << endl;
		cout << "Número de iteraciones para búsqueda de clique violada: " << K << endl;
		cout << "Número máximo de iteraciones de proyección sin desigualdad violada: " << MAXITER << endl;
		cout << "Violación mínima: " << MINVIOLATION << endl;
		cout << "Número de vértices para grafos chicos: " << SMALLGRAPH << endl;
	}
};

#endif /* SEPARATORPARAMETERS_H_ */
